/**
 * by ward @ harrydeep@163.com 
 * 2018
 */
package top.wardyan.common.util;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import cn.hutool.core.date.DateTime;

/**
 * @author ward
 * 用途:
 * 版本:
 * 创建:
 * 更新: V2 / 2019年2月16日 
 */
public final class DateUtil {
	
	/** yyyy-MM-dd HH:mm **/
	public static final String SHORT = "yyyy-MM-dd HH:mm";
	/** yyyy/MM/dd HH:mm **/
	public static final String SHORT2 = "yyyy/MM/dd HH:mm";
	/** yyyy-MM-dd HH:mm:ss **/
	public static final String MIDDLE = "yyyy-MM-dd HH:mm:ss";
	/** yyyy-MM-dd HH:mm:ss.SSS **/
	public static final String FULL = "yyyy-MM-dd HH:mm:ss.SSS";
	/** yyyy-MM-dd HH:mm:ss.SSS EEEE **/
	public static final String FULL2 = "yyyy-MM-dd HH:mm:ss.SSS EEEE";
	/** 默认格式 **/
	private static final SimpleDateFormat  format = new SimpleDateFormat(MIDDLE);
	private static final SimpleDateFormat  FULLFORMAT = new SimpleDateFormat(FULL);
	
	/** 获取当前时间 **/
	public static Timestamp getCurrentTimestamp(){
		return new Timestamp(System.currentTimeMillis());
	}
	
	
	
	/** 格式化指定时间, 以默认格式yyyy-MM-dd HH:mm:ss. 如果参数有空值则返回零长度字符串 **/
	public static String format(Timestamp time){
		return time != null ? format.format(time) : "";
	}
	
	/** 格式化指定时间, 以指定格式. 如果参数有空值则返回零长度字符串 **/
	public static String format(Timestamp time, String pattern){
		return time != null && pattern != null ? new SimpleDateFormat(pattern).format(time) : "";
	}
	
	/** 格式化指定时间, 以默认格式yyyy-MM-dd HH:mm:ss **/
	public static String format(Date date) {
		return date != null ? format.format(date) : "";
	}
	
	
	
	
	/** 格式化当前时间, 以默认格式yyyy-MM-dd HH:mm:ss **/
	public static String formatNow(){
		return format.format(getCurrentTimestamp());
	}
	
	/** 格式化当前时间, 以默认格式yyyy-MM-dd HH:mm:ss.SSS **/
	public static String formatNowFull(){
		return FULLFORMAT.format(getCurrentTimestamp());
	}
	
	/** 格式化当前时间, 以指定格式. 如果参数有空值则返回零长度字符串**/
	public static String formatNow(String pattern){
		return pattern != null ? new SimpleDateFormat(pattern).format(getCurrentTimestamp()) : "";
	}
	
	/** 从字符串中解析时间出来.如果参数有空值则返回null **/
	public static Timestamp parse(String time){
		try{
			DateTime dt = cn.hutool.core.date.DateUtil.parse(time);
			// return Timestamp.valueOf(time);
			return new Timestamp(dt.getTime());
		}catch(Exception e){
			return null;
		}
	}
	

	
	/**
	 * 格式化时间
	 * @param time
	 * @param type 1当天开始时间, 2当天结束时间, 3本周开始时间, 4本周结束时间, 5本月开始时间, 6本月结束时间, 7今年开始时间, 8今年结束时间, 9过去半年开始, 10过去半年结束, 11过去一年开始, 12过去一年结束, (没有13和14), 15过去一个月开始, 16过去一个月结束, 17过去一周开始, 18过去一周结束, 19昨天开始, 20昨天结束 
	 * @return
	 */
	public static Timestamp range(Timestamp time, int type) {
		int rt = 0;		// 返回类型: =0时直接返回, =1时递归调用本方法, 其中type=1; =2时也是递归调用本方法, type=2
		if(time == null) {
			time = new Timestamp(System.currentTimeMillis());
		}
		Calendar cal = Calendar.getInstance();
		cal.setTimeInMillis(time.getTime());
		
		switch (type){
		case 1:		// 当天开始
			cal.set(Calendar.HOUR_OF_DAY, 0);
			cal.set(Calendar.MINUTE, 0);
			cal.set(Calendar.SECOND, 0);
			cal.set(Calendar.MILLISECOND, 0);
			rt = 0;
			break;
		case 2 :	// 当天结束
			cal.set(Calendar.HOUR_OF_DAY, 23);
			cal.set(Calendar.MINUTE, 59);
			cal.set(Calendar.SECOND, 59);
			cal.set(Calendar.MILLISECOND, 997);
			rt = 0;
			break;
		case 3 :	// 本周开始
			int dayofweek = cal.get(Calendar.DAY_OF_WEEK);
	        if (dayofweek == 1) {
	            dayofweek += 7;
	        }
	        cal.add(Calendar.DATE, 1 - dayofweek);
	        rt = 1;
			break;
		case 4 :	// 本周结束
			Timestamp weekbegin = range(time, 3);
			cal.setTimeInMillis(weekbegin.getTime());
	        cal.add(Calendar.DAY_OF_WEEK, 6);
	        rt = 2;
			break;
		case 5 :	// 本月开始
			int dayofmonth = cal.get(Calendar.DAY_OF_MONTH);
	        cal.add(Calendar.DATE, 1-dayofmonth);
	        rt = 1;
			break;
		case 6 :	// 本月结束
			Timestamp monthbegin = range(time, 5);
			cal.setTimeInMillis(monthbegin.getTime());
	        cal.add(Calendar.MONTH, 1);
	        cal.add(Calendar.DATE, -1);
	        rt = 2;
			break;
		case 7 :	// 今年开始
			int dayofyear = cal.get(Calendar.DAY_OF_YEAR);
	        cal.add(Calendar.DATE, 1-dayofyear);
	        rt = 1;
			break;
		case 8 :	// 今年结束
			Timestamp yarnbegin = range(time, 7);
			cal.setTimeInMillis(yarnbegin.getTime());
	        cal.add(Calendar.YEAR, 1);
	        cal.add(Calendar.DATE, -1);
	        rt = 2;
			break;
		case 9 :	// 过去半年开始
	        cal.add(Calendar.MONTH, -6);
	        rt = 1;
			break;
		case 10 : case 12: case 16: case 18: case 20:		// 过去半年结束 // 一年 // 一个月 // 一周 // 昨天 
			Timestamp b = range(time, 2);
			cal.setTimeInMillis(b.getTime());
	        rt = 2;
			break;
		case 11 :	// 过去一年开始
	        cal.add(Calendar.YEAR, -1);
	        rt = 1;
			break;
		case 15 :	// 过去一个月开始
	        cal.add(Calendar.MONTH, -1);
	        rt = 1;
	        break;
		case 17 :	// 过去一周开始
	        cal.add(Calendar.WEEK_OF_YEAR, -1);
	        rt = 1;
	        break;
		case 19 :	// 昨天
	        cal.add(Calendar.DATE, -1);
	        rt = 1;
	        break;
		}
		
		Timestamp rs = null;
		if(rt == 1 || rt == 2) {
			rs = range(new Timestamp(cal.getTimeInMillis()), rt);
		}else {
			rs = new Timestamp(cal.getTimeInMillis());
		}
		return rs;
	}
	
	public static Timestamp range(int type) {
		Timestamp now = new Timestamp(System.currentTimeMillis());
		return range(now, type);
	}
	
	
	
	public static void main(String[] args) {
//		Timestamp now = new Timestamp();
//		System.out.println(DateUtil.range(, 0));

//		System.out.println(DateUtil.range(0));
//		System.out.println(DateUtil.range(1));
//		System.out.println(DateUtil.range(2));
//		System.out.println(DateUtil.range(3));
//		System.out.println(DateUtil.range(4));
//		System.out.println(DateUtil.range(5));
//		System.out.println(DateUtil.range(6));
//		System.out.println(DateUtil.range(7));
//		System.out.println(DateUtil.range(8));
//		System.out.println(DateUtil.range(9));
//		System.out.println(DateUtil.range(10));
//		System.out.println(DateUtil.range(11));
//		System.out.println(DateUtil.range(12));
//		System.out.println(DateUtil.range(13));
//		System.out.println(DateUtil.range(14));
		System.out.println(DateUtil.range(15));
		System.out.println(DateUtil.range(16));
		System.out.println(DateUtil.range(17));
		System.out.println(DateUtil.range(18));
		System.out.println(DateUtil.range(19));
		System.out.println(DateUtil.range(20));
	}

	
}
